#pragma once

#include <Windows.h>

//////////////////////////////////////////////////////////////////////////
//  CritSec
//  Description: Wraps a critical section.
//////////////////////////////////////////////////////////////////////////

class CritSec
{
public:
	CRITICAL_SECTION m_criticalSection;
public:
	CritSec()
	{
		InitializeCriticalSectionEx(&m_criticalSection, 100, 0);
	}

	~CritSec()
	{
		DeleteCriticalSection(&m_criticalSection);
	}

	_Acquires_lock_(m_criticalSection)
		void Lock()
	{
		EnterCriticalSection(&m_criticalSection);
	}

	_Releases_lock_(m_criticalSection)
		void Unlock()
	{
		LeaveCriticalSection(&m_criticalSection);
	}
};


//////////////////////////////////////////////////////////////////////////
//  AutoLock
//  Description: Provides automatic locking and unlocking of a 
//               of a critical section.
//
//  Note: The AutoLock object must go out of scope before the CritSec.
//////////////////////////////////////////////////////////////////////////

class AutoLock
{
private:
	CritSec *m_pCriticalSection;
public:
	_Acquires_lock_(m_pCriticalSection)
		AutoLock(CritSec& crit)
	{
		m_pCriticalSection = &crit;
		m_pCriticalSection->Lock();
	}

	_Releases_lock_(m_pCriticalSection)
		~AutoLock()
	{
		m_pCriticalSection->Unlock();
	}
};
